// 路由鉴权文件：项目中路由能不能被访问的权限设置（某个路由什么条件下可以访问，什么条件下不可以访问）
import router from "./router"
// 引入进度条插件
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
// 引入用户小仓库
import pinia from './store'
import useUserStore from "./store/modules/user"
// 引入系统配置文件
import setting from './setting'

// 去掉加载进度环
nprogress.configure({ showSpinner: false })
// 获取用户小仓库
let userStore=useUserStore(pinia)

// 全局守卫：项目中任意路由切换都会触发的钩子
// 全局前置守卫：访问每个路由之前执行
// to：将访问的路由对象 from:从哪个路由而来 next：路由的放行函数
router.beforeEach(async(to,from,next)=>{
    // 页面标题
    document.title=`${setting.title}-${to.meta.title}`
    // 进度条开始
    nprogress.start()
    // 获取token，判断用户登录还是未登录
    let token=userStore.token
    // 获取用户名字
    let username=userStore.username
    if(token){
        // 用户登录成功，访问login，无法访问，指向首页
        if(to.path=='/login'){
            next({path:'/'})
        }else{
            // 登录成功，访问其余路由
            // 有用户信息
            if(username){
                next()
            }else{
                // 没有用户信息，在守卫这里发请求获取到用户信息再放行
                try{
                    // 获取用户信息
                    await userStore.userInfo()
                    // 万一刷新的是异步路由，有可能获取到的用户信息，异步路由还没有加载完毕，出现空白的效果
                    next({...to,replace:true})
                }catch(error){
                    // token过期、用户手动修改了本地存储
                    // 相当于退出登录
                    // 1. 给服务器发请求，告诉token过期
                    // 2. 清空用户仓库数据
                    await userStore.userLogout()
                    // 3. 回到登录页
                    next({path:'/login',query:{redirect:to.path}})
                }
            }
        }
    }else{
        // 用户未登录
        if(to.path=='/login'){
            next()
        }else{
            next({path:'/login',query:{redirect:to.path}})
        }
    }
})

// 全局后置守卫
router.afterEach((to,from)=>{
    // 进度条结束
    nprogress.done()
})

// 用户未登录：只可以访问/login
// 用户登录成功：不可以再访问/login，让其跳转到首页，其余路由可以访问
// 根据用户仓库中的token，判断用户是否登录